import { rmSync } from "node:fs";
import path from "node:path";
import { defineConfig } from "vite";
import react from "@vitejs/plugin-react";
import electron from "vite-plugin-electron";
import renderer from "vite-plugin-electron-renderer";
import pkg from "./package.json";
import {
	presetUno,
	presetAttributify,
	presetWind,
	presetIcons,
	presetWebFonts,
} from "unocss";
import unocss from "unocss/vite";

// https://vitejs.dev/config/
export default defineConfig(({ command }) => {
	rmSync("dist-electron", { recursive: true, force: true });

	const isServe = command === "serve";
	const isBuild = command === "build";
	const sourcemap = isServe || !!process.env.VSCODE_DEBUG;

	return {
		resolve: {
			alias: {
				"@": path.join(__dirname, "src"),
				"@views": path.join(__dirname, "src/views"),
				"@components": path.join(__dirname, "src/components"),
				"@services": path.join(__dirname, "src/services"),
				"@utils": path.join(__dirname, "src/utils"),
				"@hooks": path.join(__dirname, "src/hooks"),
			},
		},
		plugins: [
			unocss({
				rules: [
					[
						"shadowY",
						{
							"box-shadow": `5px 5px 6px #dadada,
						-5px -5px 6px #f6f6f6`,
						},
					],
				],
				presets: [
					presetUno(),
					presetAttributify(),
					presetWind(),
					presetIcons(),
					presetWebFonts({
						provider: "google",
						fonts: {
							marhey: "Marhey",
						},
					}),
				],
			}),
			react(),
			electron([
				{
					// Main-Process entry file of the Electron App.
					entry: "electron/main/index.ts",
					onstart(options) {
						if (process.env.VSCODE_DEBUG) {
							console.log(
								/* For `.vscode/.debug.script.mjs` */ "[startup] Electron App"
							);
						} else {
							options.startup();
						}
					},
					vite: {
						build: {
							sourcemap,
							minify: isBuild,
							outDir: "dist-electron/main",
							rollupOptions: {
								external: Object.keys(
									"dependencies" in pkg
										? pkg.dependencies
										: {}
								),
							},
						},
					},
				},
				{
					entry: "electron/preload/index.ts",
					onstart(options) {
						// Notify the Renderer-Process to reload the page when the Preload-Scripts build is complete,
						// instead of restarting the entire Electron App.
						options.reload();
					},
					vite: {
						build: {
							sourcemap: sourcemap ? "inline" : undefined, // #332
							minify: isBuild,
							outDir: "dist-electron/preload",
							rollupOptions: {
								external: Object.keys(
									"dependencies" in pkg
										? pkg.dependencies
										: {}
								),
							},
						},
					},
				},
			]),
			// Use Node.js API in the Renderer-process
			renderer(),
		],
		server:
			process.env.VSCODE_DEBUG &&
			(() => {
				const url = new URL(pkg.debug.env.VITE_DEV_SERVER_URL);
				return {
					host: url.hostname,
					port: +url.port,
				};
			})(),
		clearScreen: false,
	};
});
